home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Audio, Video & Photo / Songbird 0.7.0 / Songbird_0.7.0_windows-i686-msvc8.exe / components / sbBundle.js < prev    next >
Text File  |  2008-08-06  |  11KB  |  359 lines

  1. /**
  2. //
  3. // BEGIN SONGBIRD GPL
  4. // 
  5. // This file is part of the Songbird web player.
  6. //
  7. // Copyright(c) 2005-2008 POTI, Inc.
  8. // http://songbirdnest.com
  9. // 
  10. // This file may be licensed under the terms of of the
  11. // GNU General Public License Version 2 (the "GPL").
  12. // 
  13. // Software distributed under the License is distributed 
  14. // on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either 
  15. // express or implied. See the GPL for the specific language 
  16. // governing rights and limitations.
  17. //
  18. // You should have received a copy of the GPL along with this 
  19. // program. If not, go to http://www.gnu.org/licenses/gpl.html
  20. // or write to the Free Software Foundation, Inc., 
  21. // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  22. // 
  23. // END SONGBIRD GPL
  24. //
  25.  */
  26. Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
  27.  
  28. const SONGBIRD_BUNDLE_IID = Components.interfaces.sbIBundle;
  29.  
  30. function Bundle() {
  31.   this._datalisteners = new Array();
  32.   this._installlisteners = new Array();
  33.  
  34.   var obs = Components.classes["@mozilla.org/observer-service;1"]
  35.                       .getService(Components.interfaces.nsIObserverService);
  36.   obs.addObserver(this, "quit-application", false);
  37. }
  38.  
  39. Bundle.prototype.constructor = Bundle;
  40.  
  41. Bundle.prototype = {
  42.   classDescription: "Songbird Bundle Service Interface",
  43.   classID:          Components.ID("{ff29ec35-1294-42ae-a341-63d0303df969}"),
  44.   contractID:       "@songbirdnest.com/Songbird/Bundle;1",
  45.  
  46.   _bundleid: null,
  47.   _bundleURL: null,
  48.   _req: null,
  49.   _datalisteners: null,
  50.   _installlisteners: null,
  51.   _status: 0,
  52.   _extlist: null,
  53.   _browser: null,
  54.   _downloadListener: null,
  55.   _url: null,
  56.   _file: null,
  57.   _filename: null,
  58.   _needrestart: false,
  59.   _bundleversion: 0,
  60.   _simulate_lots_of_entries: false,
  61.   _init: false,
  62.   _onload: null,
  63.   _onerror: null,
  64.   _installresult: -1,
  65.   _timer: null,
  66.  
  67.   LOG: function(str) {
  68.     var consoleService = Components.classes['@mozilla.org/consoleservice;1']
  69.                             .getService(Components.interfaces.nsIConsoleService);
  70.     consoleService.logStringMessage(str);
  71.   },
  72.   
  73.   
  74.   get bundleId() {
  75.     return this._bundleid;
  76.   },
  77.  
  78.   set bundleId(aStringValue) {
  79.     // Make sure there is a string object to pass.
  80.     if (aStringValue == null)
  81.       aStringValue = "";
  82.     this._bundleid = aStringValue;
  83.   },
  84.  
  85.   set bundleURL(aBundleURL) {
  86.     // validate
  87.     if (aBundleURL == null)
  88.       aBundleURL = "";
  89.     this._bundleURL = aBundleURL;
  90.   },
  91.   
  92.   get bundleURL() {
  93.     return this._bundleURL;
  94.   },
  95.  
  96.   retrieveBundleData: function(aTimeout) {
  97.   
  98.     if (this._init && this._req) {
  99.       this._req.abort();
  100.       var httpReq = this._req.QueryInterface(Components.interfaces.nsIJSXMLHttpRequest);
  101.       httpReq.removeEventListener("load", this._onload, false);
  102.       httpReq.removeEventListener("error", this._onerror, false);
  103.       this._req = null;
  104.       this._status = SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_DOWNLOADING;
  105.     }
  106.     
  107.     this._onload = { 
  108.       _that: null, 
  109.       handleEvent: function( event ) { this._that.onLoad(); } 
  110.     }; this._onload._that = this;
  111.     
  112.     this._onerror = { 
  113.       _that: null, 
  114.       handleEvent: function( event ) { this._that.onError(); } 
  115.     }; this._onerror._that = this;
  116.     
  117.     this._req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
  118.                           .createInstance(Components.interfaces.nsIXMLHttpRequest);
  119.     this._req.mozBackgroundRequest = true;
  120.     var httpReq = this._req.QueryInterface(Components.interfaces.nsIJSXMLHttpRequest);
  121.     httpReq.addEventListener("load", this._onload, false);
  122.     httpReq.addEventListener("error", this._onerror, false);
  123.    
  124.     // XXXredfive - this will(may) change to the mozilla urlformatter when
  125.     //  bmo 430235 gets fixed.
  126.     // use the urlFormatter service to replace the %FOO% mumbo-jumbo
  127.     var urlFormatter = Components.classes["@songbirdnest.com/moz/sburlformatter;1"]
  128.                          .getService(Components.interfaces.sbIURLFormatter);
  129.  
  130.     var pbag = Components.classes["@mozilla.org/hash-property-bag;1"]
  131.                  .createInstance(Components.interfaces.nsIWritablePropertyBag2);
  132.  
  133.     var url = urlFormatter.formatURL(this._bundleURL, pbag);
  134.  
  135.     this._req.open('GET', url + this._getRandomParameter(), true); 
  136.     this._req.send(null);
  137.     this._init = true;
  138.  
  139.     // If specified, set up a callback to enforce request timeout
  140.     if (aTimeout > 0) {
  141.       this._timer = Components.classes["@mozilla.org/timer;1"]
  142.                               .createInstance(Components.interfaces.nsITimer);
  143.       this._timer.initWithCallback(this, aTimeout,
  144.                                    Components.interfaces.nsITimer.TYPE_ONE_SHOT);
  145.     }
  146.   },
  147.  
  148.   get bundleDataDocument() {
  149.     return this._req ? this._req.responseXML : null;
  150.   },
  151.  
  152.   get bundleDataText() {
  153.     return this._req ? this._req.responseText : "";
  154.   },
  155.   
  156.   addBundleDataListener: function(aListener) {
  157.     this._datalisteners.push(aListener);
  158.   },
  159.   
  160.   removeBundleDataListener: function (aListener) {
  161.     var r = this.getDataListenerIndex(aListener);
  162.     if (r != -1) this._datalisteners.splice(r, 1);
  163.   },
  164.   
  165.   getNumDataListeners: function() {
  166.     return this._datalisteners.length;
  167.   },
  168.   
  169.   getDataListener: function(aIndex) {
  170.     return this._datalisteners[aIndex];
  171.   },
  172.  
  173.   getDataListenerIndex: function(aListener) {
  174.     return this._datalisteners.indexOf(aListener);
  175.   },
  176.  
  177.   addBundleInstallListener: function(aListener) {
  178.     this._installlisteners.push(aListener);
  179.   },
  180.   
  181.   removeBundleInstallListener: function (aListener) {
  182.     var r = this.getInstallListenerIndex(aListener);
  183.     if (r != -1) this._installlisteners.splice(r, 1);
  184.   },
  185.   
  186.   get installListenerCount() {
  187.     return this._installlisteners.length;
  188.   },
  189.   
  190.   getInstallListener: function(aIndex) {
  191.     return this._installlisteners[aIndex];
  192.   },
  193.   
  194.   getInstallaListenerIndex: function(aListener) {
  195.     for (var i=0;i<this._installlisteners.length;i++) if (this._datalisteners[i] == aListener) return i;
  196.     return -1;
  197.   },
  198.   
  199.   get bundleDataStatus() {
  200.     return this._status;
  201.   },
  202.   
  203.   onLoad: function() {
  204.     this._status = SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS;
  205.     this.getExtensionList();
  206.     for (var i=0;i<this._datalisteners.length;i++) this._datalisteners[i].onDownloadComplete(this);
  207.   },
  208.  
  209.   onError: function() {
  210.     this._status = SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_ERROR;
  211.     for (var i=0;i<this._datalisteners.length;i++) this._datalisteners[i].onError(this);
  212.   },
  213.   
  214.   getDataNodes: function(bundledocument) {
  215.     if (!bundledocument) return null;
  216.     var datablocknodes = bundledocument.childNodes;
  217.     
  218.     for (var i=0;i<datablocknodes.length;i++) {
  219.       if (datablocknodes[i].tagName == "SongbirdInstallBundle") {
  220.         this._bundleversion = datablocknodes[i].getAttribute("version")
  221. /*
  222.         // Sample code to generate some elements for testing.
  223.         for ( var j = 0; j < 10; j++ ) {
  224.           var testElement = bundledocument.createElement("XPI");
  225.           testElement.setAttribute("name", "TEST ELEMENT #" + (j+1) );
  226.           testElement.setAttribute("url", "");
  227.           datablocknodes[i].appendChild( testElement );
  228.         }
  229. */
  230.         return datablocknodes[i].childNodes;
  231.       }
  232.     }
  233.     return null;
  234.   },
  235.  
  236.   installFlaggedExtensions: function(aWindow) {
  237.     var windowWatcherService = Components.classes['@mozilla.org/embedcomp/window-watcher;1']
  238.                             .getService(Components.interfaces.nsIWindowWatcher);
  239.                             
  240.     // TODO: do the install !
  241.     this._installresult = "";
  242.     windowWatcherService.openWindow(aWindow, "chrome://songbird/content/xul/setupProgress.xul", "_blank", "chrome,dialog=yes,centerscreen,alwaysRaised,close=no,modal", this);
  243.     return this._installresult;
  244.   },
  245.   
  246.   setInstallResult: function(aResult) {
  247.     this._installresult = aResult;
  248.   },
  249.   
  250.   getExtensionList: function() {
  251.     this._extlist = new Array();
  252.     if (this._status == SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS) {
  253.       var bundledocument = this.bundleDataDocument;
  254.       if (bundledocument) {
  255.         var nodes = this.getDataNodes(bundledocument);
  256.         if (nodes) {
  257.           for (var i=0;i<nodes.length;i++) {
  258.             if (nodes[i].tagName == "XPI") {
  259.               var inst = nodes[i].getAttribute("default");
  260.               this._extlist.push(Array(nodes[i], (inst=="true" || inst=="1")));
  261.             }
  262.           }
  263.         }
  264.       }
  265.     }
  266.   },
  267.   
  268.   get bundleExtensionCount() {
  269.     if (this._status == SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS) {
  270.       if (this._simulate_lots_of_entries) return this._extlist.length * 20;
  271.       return this._extlist.length;
  272.     }
  273.     return 0;
  274.   },
  275.   
  276.   getExtensionAttribute: function(aIndex, aAttributeName) {
  277.     if (!this._extlist) return "";
  278.     if (this._extlist.length != 0 && this._simulate_lots_of_entries) 
  279.       aIndex = aIndex % this._extlist.length;
  280.     if (this._status == SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS && aIndex < this.bundleExtensionCount) 
  281.       return this._extlist[aIndex][0].getAttribute(aAttributeName);
  282.     return "";
  283.   },
  284.       
  285.   getExtensionInstallFlag: function(aIndex) {
  286.     if (!this._extlist) return false;
  287.     if (this._extlist.length != 0 && this._simulate_lots_of_entries) 
  288.       aIndex = aIndex % this._extlist.length;
  289.     if (this._status == SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS && aIndex < this.bundleExtensionCount) 
  290.       return this._extlist[aIndex][1];
  291.     return false;
  292.   },
  293.   
  294.   setExtensionInstallFlag: function(aIndex, aInstallFlag) {
  295.     if (!this._extlist) return;
  296.     if (this._extlist.length != 0 && this._simulate_lots_of_entries) 
  297.       aIndex = aIndex % this._extlist.length;
  298.     if (this._status == SONGBIRD_BUNDLE_IID.BUNDLE_DATA_STATUS_SUCCESS && aIndex < this.bundleExtensionCount) 
  299.       this._extlist[aIndex][1] = aInstallFlag;
  300.   },
  301.   
  302.   _getRandomParameter: function() {
  303.     var aUUIDGenerator = (Components.classes["@mozilla.org/uuid-generator;1"]).createInstance();
  304.     aUUIDGenerator = aUUIDGenerator.QueryInterface(Components.interfaces.nsIUUIDGenerator);
  305.     var aUUID = aUUIDGenerator.generateUUID();
  306.     return "?randomguid=" + escape(aUUID);
  307.   },
  308.   
  309.   setNeedRestart: function(aRequired) {
  310.     this._needrestart = aRequired;
  311.   },
  312.  
  313.   get restartRequired() {
  314.     return this._needrestart;
  315.   },
  316.  
  317.   get bundleDataVersion() {
  318.     return this._bundleversion;
  319.   },
  320.   
  321.   // nsITimerCallback
  322.   notify: function(timer)
  323.   {
  324.     if(this._req.readyState != 4) { // 4 = COMPLETED
  325.       // abort() stops the http request so the normal event listeners are never
  326.       // called so we need to call onError() manually.
  327.       this._req.abort();
  328.       this.onError();
  329.     }
  330.     this._timer.cancel();
  331.     this._timer = null;
  332.   },
  333.  
  334.   // nsIObserver
  335.   observe: function(aSubject, aTopic, aData) {
  336.     if (aTopic == "quit-application") {
  337.       if (this._timer) {
  338.         this._timer.cancel();
  339.         this._timer = null;
  340.       }
  341.     }
  342.   },
  343.  
  344.   /**
  345.    * See nsISupports.idl
  346.    */
  347.   QueryInterface:
  348.     XPCOMUtils.generateQI([SONGBIRD_BUNDLE_IID,
  349.                            Components.interfaces.sbPIBundle,
  350.                            Components.interfaces.nsIWebProgressListener,
  351.                            Components.interfaces.nsISupportsWeakReference,
  352.                            Components.interfaces.nsIObserver])
  353. }; // Bundle.prototype
  354.  
  355. function NSGetModule(compMgr, fileSpec) {
  356.   return XPCOMUtils.generateModule([Bundle]);
  357. }
  358.  
  359.